package while_lang.semantics;

/**
 */
public abstract class Type {
	public abstract String unparse();
	
	public abstract boolean isType(Class<?> javaType);
	
	public boolean isType(Object value) {
		return isType(value.getClass());
	}
	
	public boolean isCompatible(Class<?> javaType) {
		return isType(javaType);
	}
	
	public boolean isCompatible(Object value) {
		return isCompatible(value.getClass());
	}
	
	public boolean isCompatible(Type type) {
		return type.getClass() == this.getClass();
	}
	
	public Object coerce(Object value) {
		if (isType(value)) {
			return value;
		} else {
			throw new Error("Valor "+ value	+" no se puede coercionar a "+ this.unparse() +".");
		}
	}
	
	public boolean isBaseType() {
		return true; // Por defecto los tipos son básicos.
	}
	
}
